package cn.edu.dgut.sai.config;

import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.context.annotation.DeferredImportSelector;
import org.springframework.context.annotation.Import;
import org.springframework.core.io.support.SpringFactoriesLoader;
import org.springframework.core.type.AnnotationMetadata;

/**
 * 企业级软件开发-实训课程：Spring Boot 2.x
 *
 * @author 黎志雄
 * 2019-9-17
 *
 * 本类被{@link Import}导入后会被实例化为Bean。
 * 同时本类实现了{@link BeanClassLoaderAware},所以会被spring容器注入{@code ClassLoaders$AppClassLoader}。
 *
 * {@link SpringFactoriesLoader}利用{@code ClassLoaders$AppClassLoader}获取"META-INF/spring.factories"Resource资源文件，识别资源文件中的各个 键=值，其中的 值 是List。
 * 接着读取 键为 EnableMagicAutoConfiguration的类全路径 的值，并返回一个String数组。
 * 这里跟以前直接构造String数组类似，只是这里通过读取 META-INF/spring.factories 资源文件获得。
 */
public class MagicAutoConfigurationImportSelector
        implements DeferredImportSelector, BeanClassLoaderAware {

    private ClassLoader classLoader;

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return SpringFactoriesLoader
                .loadFactoryNames(EnableMagicAutoConfiguration.class, this.classLoader)
                .toArray(new String[]{});
    }

    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        this.classLoader = classLoader;
    }

}
